#ifndef _ANT_COMBO_VOCABULARY_H
#define _ANT_COMBO_VOCABULARY_H

#include "ComboReduct/ant_combo_vocabulary/ant_builtin_action.h"
#include "ComboReduct/ant_combo_vocabulary/ant_perception.h"
#include "ComboReduct/ant_combo_vocabulary/ant_action_symbol.h"
#include "ComboReduct/ant_combo_vocabulary/ant_indefinite_object.h"
#include "ComboReduct/combo/vertex.h"

//this namespace is defined in order to break ambiguities
//and make coexist several vocabularies
namespace ant_combo {

  using namespace combo;

  //return a pointer to class base instance
  //of a given action or perception enum
  builtin_action instance(ant_builtin_action_enum);
  perception instance(ant_perception_enum);
  action_symbol instance(ant_action_symbol_enum);
  indefinite_object instance(ant_indefinite_object_enum);

  //get the enum corresponding to a builtin_action, perception or action_symbol
  ant_builtin_action_enum get_enum(builtin_action);
  ant_perception_enum get_enum(perception);
  ant_action_symbol_enum get_enum(action_symbol);
  ant_indefinite_object_enum get_enum(indefinite_object);

  std::istream& operator>>(std::istream& in, combo::vertex& v);
  std::istream& operator>>(std::istream& in, combo::vtree& tr);
  
  bool operator==(builtin_action, ant_builtin_action_enum);
  bool operator==(ant_builtin_action_enum, builtin_action);
  bool operator!=(builtin_action, ant_builtin_action_enum);
  bool operator!=(ant_builtin_action_enum, builtin_action);
  bool operator==(perception, ant_perception_enum);
  bool operator==(ant_perception_enum, perception);
  bool operator!=(perception, ant_perception_enum);
  bool operator!=(ant_perception_enum, perception);
  bool operator==(action_symbol, ant_action_symbol_enum);
  bool operator==(ant_action_symbol_enum, action_symbol);
  bool operator!=(action_symbol, ant_action_symbol_enum);
  bool operator!=(ant_action_symbol_enum, action_symbol);
  bool operator==(indefinite_object, ant_indefinite_object_enum);
  bool operator==(ant_indefinite_object_enum, indefinite_object);
  bool operator!=(indefinite_object, ant_indefinite_object_enum);
  bool operator!=(ant_indefinite_object_enum, indefinite_object);
  
}//~namespace ant_combo

//this is added to be sure that the operators == and != between
//combo operator type and enum are used
//(if not then it leads to buggy situation because enum are cast to
//pointer, if you have a better idea please contact me : ngeiswei@gmail.com)
//That means that different vocabularies will not be able to coexist
//with the same code file but will be able within the same library
//using namespace ant_combo;

#endif

